<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型继承</title>
</head>
<body>
    
</body>
</html>
<script>
    //使用Object.setPrototypeOf 可以设置原型对象，
    //使用object.getPrototypeOf  用于获取一个对象的原型

    // let obj = {
    //     name : "后盾人"
    // };
    // let hd = {
    //     web : "houdunren"
    // };

    // let cms = {
    //     soft : "hdcms"
    // };

    //让obj继承hd ，就是设置obj 的原型为hd
    // Object.setPrototypeOf(obj,hd);
    // Object.setPrototypeOf(hd,cms);
    // console.log(obj.web)

    //原型链   obj < hd < web
    //obj的原型是hd   hd的原型是cms   cms的原型是object   所以  obj 的父亲是hd  obj的爷爷是cms obj 的祖宗是object
    // console.log(Object.getPrototypeOf(hd) == cms);
    // console.log(obj)


    //原型检测
    //instanceof 检测构造函数的 prototype 属性是否出现某个实例对象的原型链上
    //只要是在原型链上的  都是可以实现的  原型之间是可以相互切换的
    // function A(){}
    // function B(){}
    // function C(){}
    // const b = new B();
    // A.prototype = b;
    // const a = new A();
    // C.prototype = a;
    // const c = new C();
    
    // console.log(a instanceof A);
    // console.log(b instanceof B);
    // console.log(a instanceof B);
    // console.log(c instanceof B);


    //使用isPrototypeOf 检测一个对象是否在另外一个对象的原型链上
    // const a = {};
    // const b = {};
    // const c = {};
    // Object.setPrototypeOf(a,b);
    // Object.setPrototypeOf(b,c);
    // console.log(b.isPrototypeOf(a));
    // console.log(c.isPrototypeOf(b));
    // console.log(c.isPrototypeOf(a));


    //属性遍历
    //使用 in 检测原型链上是否存在某个属性   使用hasOwnProtoperty 只检测当前对象是否存在某个属性
    // let a = {url : "houdunren"};
    // let b = {name : "后盾人"};
    // Object.setPrototypeOf(a,b);
    // // console.log('name' in a);
    // console.log(a.hasOwnProperty('name'));
    // console.log(a.hasOwnProperty('url'))


    //使用  for in 遍历同时会遍历原型上的属性
    // let hd = {name : "后盾人"};
    // let xj = Object.create(hd,{
    //     url : {
    //         value : "houdunren.com",
    //         enumerable:true
    //     }
    // });

    // // console.log(xj)

    // //使用hasOwnProperty 方法判断对象是否存在属性，而不会查找原型上
    // //所以只想遍历当前对象上的属性  就使用以下代码
    // for(const key in xj){
    //     if(xj.hasOwnProperty(key)){
    //         console.log(key)
    //     }
    // }



</script>